/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import pkg.Konstanten;
import java.util.Arrays;

/**
 *
 * @author Grubi
 */
public class Result {
    /**
     * liefert die Anzahl der Punkte, der der Wurf des Würfelfeldes
     * <code>a</code> bekommt, wenn der Modifier <code>mod</code> verwendet
     * wird. Die Modifier sind vom Inderface <code>Point</code>
     * @param a Feld von Würfelzahlen
     * @param mod Modifier
     * @return Ergebnis
     */
    public static int getResult(int[] a, int mod){
        if(a.length != 5){
            return -1;
        }
        switch (mod){
            case Konstanten.R_1: return getOne(a);
            case Konstanten.R_2: return getTwo(a);
            case Konstanten.R_3: return getThree(a);
            case Konstanten.R_4: return getFour(a);
            case Konstanten.R_5: return getFive(a);
            case Konstanten.R_6: return getSix(a);
            case Konstanten.R_S: return getStreet(a);
            case Konstanten.R_F: return getFullHouse(a);
            case Konstanten.R_P: return getPoker(a);
            case Konstanten.R_G: return getGrande(a);
            case Konstanten.R_C: return getChance(a);
            default: return -1;
        }
    }
    
    /**
     * berechnet die Anzahl der Einsen im Feld <code>a</code> multipliziert
     * mit 1.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getOne(int[] a) {
        int r = 0;
        for(int i : a){
            if(i == 1){
                r++;
            }
        }
        return r;
    }
    
    /**
     * berechnet die Anzahl der Zweien im Feld <code>a</code> multipliziert
     * mit 2.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getTwo(int[] a) {
        int r = 0;
        for(int i : a){
            if(i == 2){
                r += 2;
            }
        }
        return r;
    }
    
    /**
     * berechnet die Anzahl der Dreien im Feld <code>a</code> multipliziert
     * mit 3.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getThree(int[] a) {
        int r = 0;
        for(int i : a){
            if(i == 3){
                r += 3;
            }
        }
        return r;
    }
    
    /**
     * berechnet die Anzahl der Vieren im Feld <code>a</code> multipliziert
     * mit 4.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getFour(int[] a) {
        int r = 0;
        for(int i : a){
            if(i == 4){
                r += 4;
            }
        }
        return r;
    }
    
    /**
     * berechnet die Anzahl der Fuenfen im Feld <code>a</code> multipliziert
     * mit 5.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getFive(int[] a) {
        int r = 0;
        for(int i : a){
            if(i == 5){
                r += 5;
            }
        }
        return r;
    }
    
    /**
     * berechnet die Anzahl der Sechsen im Feld <code>a</code> multipliziert
     * mit 6.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getSix(int[] a) {
        int r = 0;
        for(int i : a){
            if(i == 6){
                r += 6;
            }
        }
        return r;
    }
    
    /**
     * prueft, ob das gelieferte Feld <code>a</code> eine kleine bzw grosse
     * Strasse beinhaltet. Beinhaltet es eine, wird 20 zurueckgelierfert.
     * Wenn nicht, returniert die Methode 0.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getStreet(int[] a) {
        int r = 20;
        Arrays.sort(a);
        
        if((a[0] == 1 && a[1] == 2 && a[2] == 3 && a[3] == 4 && a[4] == 5) ||
               (a[0] == 2 && a[1] == 3 && a[2] == 4 && a[3] == 5 && a[4] == 6)){
            return r;
        }
        return 0;
    }
    
    /**
     * prueft, ob das gelieferte Feld <code>a</code> ein Full House beinhaltet.
     * Beinhaltet es eines, wird 30 zurueckgelierfert. Wenn nicht, returniert
     * die Methode 0.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getFullHouse(int[] a) {
        int r = 30;
        Arrays.sort(a);
        
        if((a[0] == a[1] && a[2] == a[3] && a[3] == a[4] && a[0] != a[4]) ||
                (a[0] == a[1] && a[1] == a[2] && a[3] == a[4] && a[0] != a[4])){
            return r;
        }
        return 0;
    }
    
    /**
     * prueft, ob das gelieferte Feld <code>a</code> einen Poker beinhaltet.
     * Beinhaltet es einen, wird 40 zurueckgelierfert. Wenn nicht, returniert
     * die Methode 0.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getPoker(int[] a) {
        int r = 40;
        Arrays.sort(a);
        
        if((a[0] == a[1] && a[1] == a[2] && a[2] == a[3]) ||
                (a[1] == a[2] && a[2] == a[3] && a[3] == a[4])){
            return r;
        }
        return 0;
    }
    
    /**
     * prueft, ob das gelieferte Feld <code>a</code> ein Grande beinhaltet.
     * Beinhaltet es eines, wird 40 zurueckgelierfert. Wenn nicht, returniert
     * die Methode 0.
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getGrande(int[] a) {
        int r = 50;
        
        if(a[0] == a[1] && a[1] == a[2] && a[2] == a[3] && a[3] == a[4]){
            return r;
        }
        return 0;
    }
    
    /**
     * zaehlt alle Zahlen im Array <code>a</code> zusammen und returniert das
     * Ergebnis
     * @param a Feld von Würfelzahlen
     * @return Ergebnis
     */
    private static int getChance(int[] a) {
        int r = 0;
        for(int i : a){
            r += i;
        }
        return r;
    }

}